//引入axios
import type { AxiosInstance,AxiosRequestConfig,AxiosResponse} from 'axios'
import axios from 'axios';
import cookie from 'js-cookie'
import router from '@/router'
import Nprogress from 'nprogress'//进度条，下载后先在main.ts引入
import {useUserstore} from '@/stores/counter'
import qs from 'qs'
let baseURL='';
if (process.env.NODE_ENV=="development") {//判断开发环境上线前代理
   baseURL="/m.api"
  
} else {
   baseURL='http://196.168.1.88:8080/m.api'
}
let instance:AxiosInstance=axios.create({//创建axios实例
   baseURL,
   headers:{'content-type':'application/x-www-form-urlencoded'}//数据类型
})
// 添加拦截器
instance.interceptors.request.use((config:AxiosRequestConfig) => {
   Nprogress.start()
if (config.headers) {//有headers就将获得的令牌存起来
   config.headers['AdminToken']=cookie.get('token')+''

}
return config//返回配置
},(error)=>{
   console.log('请求错误'+error);
   return Promise.reject(error)
})
//响应拦截器
const METHOD_TYPE=['_mt=edit','_mt=create','_mt=delete']//需要无痛刷新的操作类型【编辑，创建，删除】
instance.interceptors.response.use(async(response:AxiosResponse)=>{
   Nprogress.done()
   let data=response.data//封装了一个data页面请求少一个data
   let {errno,errmsg}=data
   let path=router.currentRoute.value.path//当前路由对象嵌套的路由记录
   if (10006===errno||10002===errno) {//令牌失效弹出失败原因
      const configdata=response.config.data||''//获得接口数据
      var index=METHOD_TYPE.findIndex(item=>configdata.includes(item))
      if (-1===index) {//不是【编辑，创建，删除】
         router.replace({path:'/login',query:{back:path}})//跳回登录完成后再回到当前页面
         return
      }else{//是【编辑，创建，删除】
         const store=useUserstore()//拿到存储的用户名和密码
         let {username,password}=store.users
         let logindata={_gp:'admin',_mt:'login',username:username,password:password}//重新请求一次
      const {errmsg,errno,data}=await post(logindata)//先登录
         if (200===errno) {//请求成功存token
            cookie.set('token',data)
         }else{//不成功跳转登录页面
            router.replace({path:"/login",query:{back:path}})
            return Promise.reject({errmsg,errno,data})
         }
          return instance.request(response.config)//拿到token再次请求当前页面
      }
   }
   return data
},(error)=>{
   console.log('请求响应错误'+error);
   return Promise.reject(error)
})
declare interface TyepResponse extends AxiosResponse{
   errno:number
   errmsg:string
}
// 封装请求get，post
const get=(params?:object):Promise<TyepResponse>=>{return instance.get("",{params})}
const post=(data:object,params?:object):Promise<TyepResponse>=>{return instance.post("",qs.stringify(data),{params})}

function upload(data:FormData):Promise<TyepResponse>{
   return instance.post("http://192.168.1.188:8080/upload/admin",data)
   }
export {get,post,upload}






